package com.excellent.cart.service;

import com.excellent.cart.client.GoodsClient;
import com.excellent.cart.interceptor.LoginInterceptor;
import com.excellent.cart.pojo.Cart;
import com.excellent.common.utils.JsonUtils;
import com.excellent.item.pojo.Sku;
import com.excellent.pojo.UserInfo;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Xxacker
 *
 */
@Service
public class CartService {
    /** StringRedisTemplate 具有可读性
     * RedisTemplate  不具备可读性
     * */
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private GoodsClient goodsClient;

    // 在Redis缓存中，保存的前缀
    static final String KEY_PREFIX = "excellent:cart:userId:";

    /**0. 获取用户信息
     * 1. 查询购物车记录
     * 2. 判断当前商品是否在购物车中
     * 3. 在，更新数量
     * 4. 不在，新增购物车
     * */
    public void addCart(Cart cart) {
        // 获取登录用户【通过拦截器获取】
        UserInfo user = LoginInterceptor.getLoginUser();
        // Redis的key
        String key = KEY_PREFIX + user.getId();
        // 获取hash操作对象，获取购物车记录
        BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(key);
        // 判断当前商品是否在购物车中
        Long skuId = cart.getSkuId();
        Integer num = cart.getNum();
        Boolean boo = hashOps.hasKey(skuId.toString());
        if (boo) {
            // 存在，获取购物车数据
            String json = hashOps.get(skuId.toString()).toString();
            cart = JsonUtils.parse(json, Cart.class);
            // 修改购物车数量
            cart.setNum(cart.getNum() + num);
        } else {
            // 不存在，新增购物车数据
            cart.setUserId(user.getId());
            // 其它商品信息，需要查询商品服务
            Sku sku = this.goodsClient.querySkuById(skuId);
            cart.setImage(StringUtils.isBlank(sku.getImages()) ? "" : StringUtils.split(sku.getImages(), ",")[0]);
            cart.setPrice(sku.getPrice());
            cart.setTitle(sku.getTitle());
            cart.setOwnSpec(sku.getOwnSpec());
        }
        // 将购物车数据写入redis
        hashOps.put(cart.getSkuId().toString(), JsonUtils.serialize(cart));
    }

    /*
     * 查询购物车列表
     */
    public List<Cart> queryCartList() {
        // 获取登录用户
        UserInfo user = LoginInterceptor.getLoginUser();

        // 判断是否存在购物车
        String key = KEY_PREFIX + user.getId();
        if(!this.redisTemplate.hasKey(key)){
            return null;     // 不存在，直接返回
        }
        // hashOps本质是一个Map结构
        BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(key);
        List<Object> carts = hashOps.values();
        // 判断是否有数据
        if(CollectionUtils.isEmpty(carts)){
            return null;
        }
        /* carts.stream().map()表达式，查询购物车数据
         * 都 cartJson 进行反序列化
         * collect() 组成一个新的数组
         */
        return carts.stream().map(
                cartJson -> JsonUtils.parse(cartJson.toString(), Cart.class)
        ).collect(Collectors.toList());
    }

    /**
     * 更新商品数量
     */
    public void updateNum(Cart cart){
        // 获取登录用户
        UserInfo user = LoginInterceptor.getLoginUser();

        // 判断是否存在购物车
        String key = KEY_PREFIX + user.getId();
        if(!this.redisTemplate.hasKey(key)){
            return;     // 不存在，直接返回
        }
        Integer num = cart.getNum();
        // hashOps本质是一个Map结构
        BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(key);
        String cartJson = hashOps.get(cart.getSkuId().toString()).toString();
        cart = JsonUtils.parse(cartJson, Cart.class);
        cart.setNum(num);

        hashOps.put(cart.getSkuId().toString(), JsonUtils.serialize(cart));
    }
    /**
     * 更新购物车
     */
    public void updateCart(List<Cart> cartList){
        // 获取登录用户
        UserInfo user = LoginInterceptor.getLoginUser();

        // 判断是否存在购物车
        String key = KEY_PREFIX + user.getId();
        if(!this.redisTemplate.hasKey(key)){
            return;     // 不存在，直接返回
        }

        // hashOps本质是一个 Map 结构
        BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(key);
        for (Cart cart : cartList) {
            Integer num = cart.getNum();
            String cartJson = hashOps.get(cart.getSkuId().toString()).toString();
            cart = JsonUtils.parse(cartJson, Cart.class);
            cart.setNum(num + cart.getNum());

            hashOps.put(cart.getSkuId().toString(), JsonUtils.serialize(cart));
        }
    }

    /**
     * 删除购物车中商品
     */
    public void deleteGoods(Cart cart){
        // 获取登录用户
        UserInfo user = LoginInterceptor.getLoginUser();

        // 判断是否存在购物车
        String key = KEY_PREFIX + user.getId();
        if(!this.redisTemplate.hasKey(key)){
            return;     // 不存在，直接返回
        }

        // hashOps本质是一个 Map 结构
        BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(key);
        String cartJson = hashOps.get(cart.getSkuId().toString()).toString();
        cart = JsonUtils.parse(cartJson, Cart.class);

        hashOps.delete(cart.getSkuId().toString());
    }
}
